package com.example.httpmessageconvert.httpmessageconvert.messageconfig;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;

/**
 * @author 奶茶
 * Created by on 2018/4/18.
 * ConverterFactory 可以让我们统一管理一些相关联的Converter。
 * 我们可以看到ConverterFactory接口里面就定义了一个产生Converter的getConverter方法，参数是目标类型的class。
 * 我们可以看到ConverterFactory中一共用到了三个泛型，S、R、T，其中S表示原类型，R表示目标类型，T是类型R的一个子类。
 * ConverterFactory可以将原类型转换成一组实现了相同接口类型的对象，而Converter则只能转换成一种类型。
 */
@SuppressWarnings("unchecked")
public class EnumConfig implements ConverterFactory<String, Enum> {


    /**
     * <T extends Enum> 标示 T 是 Enum 的一个子类
     * @param targetType
     * @param <T>
     * @return
     */
    @Override
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
        return new StringToEnum(targetType);
    }

    /**
     * Converter S(原类型)->T(目标类型)
     * @param <T>
     */
    public class StringToEnum<T extends Enum> implements Converter<String,T>{

        private final Class<T> enumType;

        public StringToEnum(Class<T> enumType){
            this.enumType = enumType;
        }

        @Override
        public T convert(String source) {
            if (source.length() == 0) {
                return null;
            }
            return (T)Enum.valueOf(enumType,source.trim());
        }
    }

}
